<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 
        堆栈内存的释放

        打开一个浏览器就会形成一个虚拟的栈内存(作用域,执行上下文)
        栈内存：存储变量，存储基本值和空间地址，还能为代码执行提供环境(全局栈内存)
        堆内存：就是单纯的存储引用数据类型的值

        函数执行也会开辟私有栈内存
        就会从你的运行内存中分配出一块空间，如果你的函数不短执行就会不短开辟私有扎内存，或者创建引用值不断存储也会不短开辟堆内存，如果只开辟不释放，那你的运行内存就会被大量的占用，如果把内存沾满了，就会造成堆栈溢出(内存边满，电脑就卡死了)，堆栈内存的释放是很重要的
         */

        //  function fn(){

        //  }
        //  fn()
        //  fn()
        //  let obk = {}

        // function fn(){
        //     fn()
        // }
        // fn()

        // 堆内存的释放
        // var obj = {name:11};
        // 此时的堆内存不会被销毁，因为obj变量正在占用这个堆内存的地址，如果想释放当前这个堆内存，你必须手动解除当前堆内存和obj变量的关联
        // obj = null;

        // 谷歌浏览器的销毁机制：每隔一段时间，就会检查一下当前作用域里的内存，如果发现有堆内存没有被占用，那就被释放了


        // IE和火狐：采用的是计数的规则，如果当前的堆内存的空间地址呗占用一次，就会给当前的堆内存默认加1，如果堆内存的空间被释放一次，那就默认减1，如果浏览器发现某一个堆内存的计数为0，说明当前的堆内存已经不再被占用，这时候就把他释放掉


    //  var obj = {name:11}; // af0       0
    //  var s = obj; // af0

    //  obj = null;
    //  s = null;
    //  console.log(s.name);




    </script>
</body>

</html>